package com.catazy.jetpackstudy.act2.chapter4.messenger;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.util.Log;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.catazy.jetpackstudy.R;

/**
 * - 作者: Tao
 * - 日期: 2025/2/6
 * - 时间: 10:43
 * - 描述: 跨进程通信Messenger  客户端
 * Messenger是以串行的方式处理客户端发来的消息,如果有大量的并发请求，那么用Messenger就不太合适了
 */
public class MessengerActivity extends AppCompatActivity {

    private Messenger mService;

    private Messenger mClient = new Messenger(new MessengerHandler());

    private static class MessengerHandler extends Handler {
        public MessengerHandler() {
            super();
        }

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MyConstants.MSG_FROM_SERVER:
                    // 从消息中获取数据部分
                    Bundle data = msg.getData();
                    // 从数据部分中获取字符串消息
                    String replyMsg = data.getString("reply");
                    // 将消息显示在界面上
                    Log.i("MessengerActivity", "handleMessage: " + replyMsg);
            }
        }
    }

    private ServiceConnection mConnection = new ServiceConnection() {

        /**
         * 当与服务连接建立时调用此方法
         *
         * @param name 与服务连接的组件名称
         * @param service 服务的IBinder实例，用于与服务通信
         */
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // 创建一个Messenger对象来与服务进行通信
            mService = new Messenger(service);

            // 创建一个消息对象，指定其类型为MyConstants.MSG_FROM_CLIENT
            Message msg = Message.obtain(null, MyConstants.MSG_FROM_CLIENT);

            // 创建一个Bundle对象来存储消息的数据部分
            Bundle data = new Bundle();
            // 向数据部分添加一个字符串消息
            data.putString("msg", "hello, this is client.");
            // 将数据部分设置到消息对象中
            msg.setData(data);
            // 将消息的回复目标设置为mClient，表示服务端将回复消息到客户端
            msg.replyTo = mClient;
            // 尝试发送消息到服务
            try {
                mService.send(msg);
            } catch (Exception e){
                // 如果发送过程中出现异常，则记录日志
                Log.i("MessengerActivity", "onServiceConnected: " + e.getMessage());
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_messenger);
        Intent intent = new Intent(this, MessengerService.class);
        bindService(intent, mConnection, BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        unbindService(mConnection);
        super.onDestroy();
    }
}
